﻿using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using Naruto.TaskManagement.Entitys.Models;

namespace Naruto.TaskManagement.Entitys
{
    public abstract class TaskManagementAbstractContext : DbContext
    {
        public TaskManagementAbstractContext(DbContextOptions options)
            : base(options)
        {
        }

        public virtual DbSet<TaskRecord> TaskRecord { get; set; }
        public virtual DbSet<TaskRecordImage> TaskRecordImage { get; set; }

        public virtual DbSet<OrganizationInviteRecord> OrganizationInviteRecord { get; set; }

        public virtual DbSet<ChatSessionState> ChatSessionState { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<TaskRecord>(entity =>
            {
                entity.HasIndex(e => e.Status)
                    .HasName("Index_Status");

                entity.HasIndex(e => e.Title)
                    .HasName("Index_Title");

                entity.Property(e => e.Id).ValueGeneratedNever();

                entity.Property(e => e.CreateTime)
                    .HasColumnType("datetime")
                    .HasComment("创建时间");

                entity.Property(e => e.CreateUser)
                    .IsRequired()
                    .HasColumnType("varchar(255)")
                    .HasDefaultValueSql("''")
                    .HasComment("创建人")
                    .HasCharSet("utf8mb4")
                    .HasCollation("utf8mb4_0900_ai_ci");
                entity.Property(e => e.Remark)
                  .IsRequired()
                  .HasColumnType("varchar(255)")
                  .HasDefaultValueSql("''")
                  .HasComment("备注")
                  .HasCharSet("utf8mb4")
                  .HasCollation("utf8mb4_0900_ai_ci");
                entity.Property(e => e.Description)
                    .IsRequired()
                    .HasColumnType("varchar(500)")
                    .HasDefaultValueSql("''")
                    .HasComment("描述")
                    .HasCharSet("utf8mb4")
                    .HasCollation("utf8mb4_0900_ai_ci");

                entity.Property(e => e.EndDate)
                    .HasColumnType("datetime")
                    .HasComment("截至日期");

                entity.Property(e => e.Level)
                    .HasDefaultValueSql("'5'")
                    .HasComment("事件等级0-5");
                entity.Property(e => e.IsDelete)
                  .HasColumnType("int")
                 .HasDefaultValueSql("'0'")
                 .HasComment("是否删除 1 删除 0未删除");
                entity.Property(e => e.OperationTime)
                    .HasColumnType("datetime")
                    .HasComment("操作时间");

                entity.Property(e => e.OperationUser)
                    .IsRequired()
                    .HasColumnType("varchar(255)")
                    .HasDefaultValueSql("''")
                    .HasComment("操作人")
                    .HasCharSet("utf8mb4")
                    .HasCollation("utf8mb4_0900_ai_ci");

                entity.Property(e => e.Status).HasComment("任务的状态 0 待处理 1 已处理 2取消 3 忽略");

                entity.Property(e => e.Title)
                    .IsRequired()
                    .HasColumnType("varchar(50)")
                    .HasDefaultValueSql("''")
                    .HasComment("标题")
                    .HasCharSet("utf8mb4")
                    .HasCollation("utf8mb4_0900_ai_ci");
                entity.Property(e => e.AppointUser)
                            .IsRequired()
                            .HasColumnType("varchar(255)")
                            .HasDefaultValueSql("''")
                            .HasComment("指派的用户信息")
                            .HasCharSet("utf8mb4")
                            .HasCollation("utf8mb4_0900_ai_ci");
            });
            modelBuilder.Entity<OrganizationInviteRecord>(entity =>
            {
                entity.HasIndex(e => e.Status)
                    .HasName("Index_Status");

                entity.HasIndex(e => e.InviteesUserName)
                    .HasName("Index_InviteesUserName");
                entity.HasIndex(e => e.InviteUserName)
                  .HasName("Index_InviteUserName");
                entity.Property(e => e.Id).ValueGeneratedNever();

                entity.Property(e => e.CreateTime)
                    .HasColumnType("datetime")
                    .HasComment("创建时间");

                entity.Property(e => e.InviteesUserName)
                    .IsRequired()
                    .HasColumnType("varchar(255)")
                    .HasDefaultValueSql("''")
                    .HasComment("被邀请人的用户名")
                    .HasCharSet("utf8mb4")
                    .HasCollation("utf8mb4_0900_ai_ci");
                entity.Property(e => e.InviteUserName)
                  .IsRequired()
                  .HasColumnType("varchar(255)")
                  .HasDefaultValueSql("''")
                  .HasComment("邀请人的用户名")
                  .HasCharSet("utf8mb4")
                  .HasCollation("utf8mb4_0900_ai_ci");

                entity.Property(e => e.Status)
                    .HasDefaultValueSql("'0'")
                     .HasColumnType("int")
                    .HasComment("是否接受邀请 0 待处理 1接受邀请 2拒绝 ");

                entity.Property(e => e.OperationTime)
                    .HasColumnType("datetime")
                    .HasComment("操作时间");
            });
            modelBuilder.Entity<TaskRecordImage>(entity =>
            {
                entity.HasIndex(e => e.TaskRecordId)
                    .HasName("Index_TaskRecordId");

                entity.Property(e => e.Id).ValueGeneratedNever();

                entity.Property(e => e.ImageUrl)
                    .IsRequired()
                    .HasColumnType("varchar(255)")
                    .HasComment("图片地址")
                    .HasCharSet("utf8mb4")
                    .HasCollation("utf8mb4_0900_ai_ci");

                entity.Property(e => e.TaskRecordId).HasComment("任务记录id");
            });

            modelBuilder.Entity<ChatMessage>(entity =>
            {
                entity.HasIndex(e => e.SendUser)
                    .HasName("Index_SendUser");
                entity.HasIndex(e => e.CreateTime)
                   .HasName("Index_CreateTime");
                entity.HasIndex(e => e.RecevieUser)
                    .HasName("Index_RecevieUser");

                entity.HasIndex(e => e.IsRead)
                  .HasName("Index_IsRead");
                entity.Property(e => e.Id)
                    .HasComment("主键")
                    .ValueGeneratedNever();

                entity.Property(e => e.CreateTime)
                    .HasColumnType("datetime")
                    .HasComment("创建时间");

                entity.Property(e => e.SendUser)
                    .IsRequired()
                    .HasColumnType("varchar(255)")
                    .HasDefaultValueSql("''")
                    .HasComment("发送人")
                    .HasCharSet("utf8mb4")
                    .HasCollation("utf8mb4_0900_ai_ci");

                entity.Property(e => e.RecevieUser)
                    .IsRequired()
                    .HasColumnType("varchar(255)")
                    .HasDefaultValueSql("''")
                    .HasComment("接收人")
                    .HasCharSet("utf8mb4")
                    .HasCollation("utf8mb4_0900_ai_ci");
                entity.Property(e => e.SendHeardImgUrl)
                   .IsRequired()
                   .HasColumnType("varchar(255)")
                   .HasDefaultValueSql("''")
                   .HasComment("发送人头像信息")
                   .HasCharSet("utf8mb4")
                   .HasCollation("utf8mb4_0900_ai_ci");
                entity.Property(e => e.RecevieHeardImgUrl)
                   .IsRequired()
                   .HasColumnType("varchar(255)")
                   .HasDefaultValueSql("''")
                   .HasComment("接收人头像信息")
                   .HasCharSet("utf8mb4")
                   .HasCollation("utf8mb4_0900_ai_ci");
                entity.Property(e => e.ChatContent)
                    .IsRequired()
                    .HasColumnType("varchar(500)")
                    .HasDefaultValueSql("''")
                    .HasComment("会话内容")
                    .HasCharSet("utf8mb4")
                    .HasCollation("utf8mb4_0900_ai_ci");

                entity.Property(e => e.ContentType)
                  .HasColumnType("int")
                   .IsRequired()
                  .HasDefaultValueSql("0")
                  .HasComment("会话类型 文本: 0 ;图片: 1  视频 2");
                entity.Property(e => e.SendUserId)
                 .HasColumnType("varchar(255)")
                 .HasDefaultValueSql("0")
                  .IsRequired()
                 .HasComment("发送方用户id");
                entity.Property(e => e.RecevieUserId)
                .IsRequired()
               .HasColumnType("varchar(255)")
               .HasDefaultValueSql("0")
               .HasComment("接收方用户id");
                entity.Property(e => e.IsRead)
                 .IsRequired()
                .HasColumnType("bit")
                .HasDefaultValueSql("0")
                .HasComment("消息是否读取");
            });

            modelBuilder.Entity<ChatSessionState>(entity =>
            {
                entity.HasIndex(e => e.UserId)
                    .HasName("Index_UserId");
                entity.HasIndex(e => e.ReciveUserId)
                   .HasName("Index_ReciveUserId");
                entity.HasIndex(e => e.IsDelete)
                    .HasName("Index_IsDelete");

                entity.Property(e => e.Id)
                    .HasComment("主键")
                    .ValueGeneratedNever();

                entity.Property(e => e.UpdateTime)
                    .HasColumnType("datetime")
                    .HasComment("创建时间");


                entity.Property(e => e.ChatContent)
                    .IsRequired()
                    .HasColumnType("varchar(500)")
                    .HasDefaultValueSql("''")
                    .HasComment("会话内容")
                    .HasCharSet("utf8mb4")
                    .HasCollation("utf8mb4_0900_ai_ci");
                entity.Property(e => e.UnReadMessageCount)
                 .HasColumnType("int")
                  .IsRequired()
                 .HasDefaultValueSql("0")
                 .HasComment("未读消息数");
                entity.Property(e => e.ContentType)
                  .HasColumnType("int")
                   .IsRequired()
                  .HasDefaultValueSql("0")
                  .HasComment("会话类型 文本: 0 ;图片: 1  视频 2");
                entity.Property(e => e.UserId)
                 .HasColumnType("varchar(255)")
                 .HasDefaultValueSql("0")
                  .IsRequired()
                 .HasComment("发送方用户id");
                entity.Property(e => e.ReciveUserId)
                .IsRequired()
               .HasColumnType("varchar(255)")
               .HasDefaultValueSql("0")
               .HasComment("接收方用户id");
                entity.Property(e => e.ChatContentSendUserId)
              .IsRequired()
             .HasColumnType("varchar(255)")
             .HasDefaultValueSql("0")
             .HasComment("最新一条消息的发送人id");
                entity.Property(e => e.IsDelete)
                 .IsRequired()
                .HasColumnType("bit")
                .HasDefaultValueSql("0")
                .HasComment("是否删除");
            });
        }

    }

    /// <summary>
    /// 主库
    /// </summary>
    public class TaskManagementContext : TaskManagementAbstractContext
    {
        public TaskManagementContext(DbContextOptions<TaskManagementContext> options)
            : base(options)
        {

        }
    }
    /// <summary>
    /// 从库
    /// </summary>
    public class TaskManagementSlaveContext : TaskManagementAbstractContext
    {
        public TaskManagementSlaveContext(DbContextOptions<TaskManagementSlaveContext> options)
            : base(options)
        {

        }
    }
}
